package org.openmore.opc.service;

import org.openmore.common.enums.Platform;
import org.openmore.opc.dto.BaseResponse;
import org.openmore.opc.dto.UserProfileDto;
import org.openmore.opc.dto.api.DictionaryDto;
import org.openmore.opc.dto.api.UserDto;
import org.openmore.opc.entity.User;
import org.openmore.opc.entity.enums.LoginType;
import org.openmore.opc.entity.enums.UserType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;
import java.util.Map;

public interface UserService {

        /**
         * 根据id获得Entity对象
         *
         * @param id
         * @return
         */
        User getEntityById(String id);

        /**
         * 根据id获得dto对象
         *
         * @param id
         * @return
         */
        UserDto getDtoById(String id);

        /**
         * 分页获得所有记录
         *
         * @return
         */
        List<UserDto> selectAll(String tenantId, String username, UserType type, String roleId, Boolean isVip, String phone, Platform platform, Date startTime, Date endTime);

        /**
         * 获得所有记录
         */
        long selectAllCount(String tenantId, String username, UserType type, String roleId, Boolean isVip, String phone, Platform platform, Date startTime, Date endTime);

        /**
         * 插入指定数据
         *
         * @return
         */
        UserDto insert(User user);
        /**
         * 插入指定数据
         *
         * @return
         */
        UserDto insert(UserDto dto);

        User getByOpenid(LoginType type, String openid);


        /**
         * 修改密码
         */

        void changePassword(User User, String newPassword);

        /**
         * 设置初始登录密码
         */
        void setPassword(User User, String newPassword);

        /**
         * 根据id删除数据
         */
        void deleteById(String id);

        /**
         * 更新指定的对象数据
         */
        void update(UserDto userDto);

        /**
         * 更新指定的对象数据
         */
        void update(User user);

        /**
         * 获得员工类型列表
         *
         * @return
         */
        List<DictionaryDto> getUserTypeList();


        User getUserByEmail(String tenantId, String email);

        User getUserByPhone(String tenantId, String phone);

        boolean validatePassword(User User, String pwd);

        /**
         * 返回拥有指定权限的员工列表
         *
         * @param permissionCode
         * @return
         */
        List<UserDto> selectHasPermissionUserList(String permissionCode);

        /**
         * 获取数据看板用户统计
         */
        Map<String, Long> getDataDashBoard(String tenantId);

        List<Map<String, Long>> getTotalUserDataDashBoard(String tenantId);

        /**
         * 导出用户列表表格
         */
        void expertUserExcel(HttpServletResponse response, List<UserDto> userDtos);

        /**
         * 生成newPassword的密码
         * 会使用User.salt进行加密
         *
         * @param salt
         * @return
         */
        String generatePassword(String salt, String newPassword);
        /**换绑手机号*/
        void changePhone(String userId, String phone, String captcha);

        /**不需要更新缓存的修改*/
        void updateNoCache(User entity);
        /**换绑定微信号*/
        UserProfileDto userBindWechat(String userId, String openId, String nickName);
}